import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

import * as session from 'express-session';
import * as cookieParser from 'cookie-parser';

import { NestExpressApplication } from '@nestjs/platform-express';
import { join } from 'path';

import { I18nValidationPipe, I18nValidationExceptionFilter } from 'nestjs-i18n';


import { useContainer } from 'class-validator'; // 作用就是可以让自定义校验器可以支持依赖注入


import {RedisStore} from 'connect-redis';
import { RedisService } from './shared/services/redis.service';
import { tryStart } from './shared/utils'

// import * as bodyParser from 'body-parser';

async function bootstrap(port:number) {
  // 使用 NestFactory 创建一个 NestExpressApplication 实例
  const app = await NestFactory.create<NestExpressApplication>(AppModule,{
    // logger: false, // 关闭日志
    // logger: ['error', 'warn'], // 打开指定日志级别
    // logger: console, // 使用 console 打印日志

    // logger: new MyLogger(), // 使用自定义日志类
    // logger: new ExtendedConsoleLogger()

    // bufferLogs: true,
  }); //set NO_COLOR=true 关闭彩色日志
  // app.useLogger(app.get(MyLogger));

  // 启用跨域支持
  app.enableCors({
    // origin: '*',  // 允许所有来源
    origin: ['http://127.0.0.1:8848', 'http://localhost:8848',
      'http://127.0.0.1:9527', 'http://localhost:9527',
      'http://192.168.1.117','https://www.dxcyjy.com'
    ],  // 允许的前端域名
    methods: ['GET', 'POST', 'PUT', 'DELETE'],     // 允许的请求方法
    allowedHeaders: ['Content-Type', 'Authorization'], // 允许的请求头
    // allowedHeaders: '*',
    credentials: true,  // 允许带上 Cookies 等认证信息
  });

  // 配置 body-parser 来解析 'application/x-www-form-urlencoded' 格式的请求
  // app.use(bodyParser.urlencoded({ extended: true }));
  // app.use(bodyParser.json({ type: ['application/json', 'DELETE'] })); //没用

  //自定义验证器中依赖注入 必须写这个
  useContainer(app.select(AppModule), { fallbackOnErrors: true }); // class-validator 需要使用 IOC 容器

  app.use(cookieParser());
  const redisService = app.get(RedisService);
  const redisClient = redisService.getClient();
  app.use(session({
    store:new RedisStore({client:redisClient}), //设置session存储到redis
    // cookie: {name:''}, // 设置 cookie 名称, 默认为 connect.sid
    secret: 'secret-key',
    resave: true, // 是否每次都重新保存session，即使没有修改
    saveUninitialized: true, // 是否保存未初始化的session
    cookie: {
      maxAge: 1000 * 60 * 60 * 24 * 7,
      httpOnly: true, // 防止客户端脚本访问 Cookie
    },
  }));

  // app.useGlobalPipes(new ValidationPipe({ transform: true })); // 启用后 会自动将请求体中的数据转换为DTO对象（普通对象装换成类的实例）
  app.useGlobalPipes(new I18nValidationPipe({ transform: true }));
  app.useGlobalFilters(new I18nValidationExceptionFilter({ detailedErrors: false }));

  // await app.listen(process.env.PORT ?? 4000);
  await app.listen(port);
  console.log(`App is running on port ${port}`);
}

(async()=>{
  // console.log('process.env.PORT',process.env.PORT)
  let port = await tryStart(process.env.PORT ? Number(process.env.PORT) : 4000)
  bootstrap(Number(port));
})();